// using System.Collections;
// using System.Collections.Generic;
// using UnityEngine;
// using UnityEngine.UI;
// using UnityEngine.SceneManagement;
// using DG.Tweening;
// using AppPolicy;
// using System.IO;
// using UnityEngine.Networking;
//
//
// public class LoadManager : MonoBehaviour
// {
//     public GameObject loadScreen;
//     public Slider slider;
//     public Text text;
//
//     [Header("下一级场景名称")]
//     public string next_level_scene_name = "";
//
//     [Header("是否自动进入下一级")]
//     public bool is_auto_into_next_level = false;
//
//     #region 单例
//     public static LoadManager instance;
//
//     void Awake()
//     {
//         if (instance != null)
//             Destroy(this);
//         instance = this;
//
//         var bgm_obj = GameObject.Find("/scripts/BackgroundMusic");
//         if (bgm_obj)
//         {
//             bgm_audio_source_comp = bgm_obj.GetComponent<AudioSource>();
//             init_bgm_volume = bgm_audio_source_comp.volume;
//         }
//
//         // BdUtils.log(" --- bgm_audio_source_comp:", bgm_audio_source_comp.volume);
//         // BdUtils.log(" --- init_bgm_volume:", init_bgm_volume);
//     }
//
//     #endregion
//
//     public AudioSource bgm_audio_source_comp;
//
//     public void loadNextLevel(string scene_name = "")
//     {
//         StartCoroutine(LoadLevel(scene_name));
//     }
//
//     // public string _last_scene_name;  // 保存加载前的场景名
//     public string last_scene_name
//     {
//         get
//         {
//             return BdTools.Values._last_scene_name;
//         }
//         set
//         {
//             BdTools.Values._last_scene_name = value;
//         }
//     }
//
//     IEnumerator LoadLevel(string scene_name = "")
//     {
//         // --- 隐藏掉`ui_message_box`
//         var canvas_trans = transform.Find("/Canvas");
//         foreach (var trans_i in canvas_trans.GetComponentsInChildren<Transform>(true))
//         {
//             if (trans_i.gameObject.name.Contains("ui_message_box"))
//             {
//                 trans_i.gameObject.SetActive(false);
//             }
//         }
//
//         loadScreen.SetActive(true);
//
//         AsyncOperation operation;
//
//         var current_scene = SceneManager.GetActiveScene();
//         string current_scene_name = current_scene.name;
//
//         string _real_next_level_name = "";
//
//         if (scene_name != "")
//         {
//             // --- when reload current game level
//             // BdUtils.log(" ======== load_manager 111");
//             operation = SceneManager.LoadSceneAsync(scene_name);
//             _real_next_level_name = scene_name;
//         }
//         else
//         {
//             if (BdUtils.conv_to_bool(next_level_scene_name))
//             {
//                 operation = SceneManager.LoadSceneAsync(next_level_scene_name);
//                 _real_next_level_name = next_level_scene_name;
//             }
//             else
//             {
//                 int next_scene_id = SceneManager.GetActiveScene().buildIndex + 1;
//                 operation = SceneManager.LoadSceneAsync(next_scene_id);
//                 var next_scene = SceneManager.GetSceneByBuildIndex(next_scene_id);
//                 if (next_scene != null)
//                     _real_next_level_name = next_scene.name;
//             }
//         }
//
//         // operation.allowSceneActivation = true;
//         // operation.allowSceneActivation = false;
//         // bool allowSceneActivation = scene_name == "PlayScene" ? false : true;
//         bool allowSceneActivation = _real_next_level_name == "PlayScene" ? false : true;
//         // operation.allowSceneActivation = _real_next_level_name == "PlayScene" ? false : true;
//
//
//         if (NetManager.is_in_combat_room)
//             allowSceneActivation = true;
//
//         // --- 选择了非网络对战模式, 以及退出网络对战房间的情况
//         if (BdTools.FileTools.instance.game_info_obj.game_level != 999 || (current_scene_name == "PlayScene" && _real_next_level_name == "StartScene"))
//         {
//             // --- 玩家离开了游戏状态, 检测是否网络对战模式, 是的话, 给服务端发送退出消息
//             if (NetManager.is_in_combat_room)
//             {
//                 BdUtils.log(" === 现在应该发送`MsgExit: 退出房间`的网络封包了!");
//                 var my_msg = new MsgExit(self_exit: true);
//                 NetManager.Send(my_msg);
//                 yield break;
//             }
//         }
//         operation.allowSceneActivation = allowSceneActivation;
//         // yield break;
//
//         float value = 0f;
//
//         float start_time = Time.time;
//         while (Time.time - start_time <= 0.5f)
//         {
//             value = Time.time - start_time;
//             slider.value = value;
//             text.text = value.ToString("P0");
//             yield return new WaitForSeconds(BdUtils.get_random_float(0.05f, 0.1f));
//         }
//
//         while (!operation.isDone)
//         {
//             if (operation.progress <= value)
//                 continue;
//
//             slider.value = operation.progress;
//             text.text = operation.progress.ToString("P0");
//
//             if (operation.progress >= 0.9f)
//             {
//                 if (is_auto_into_next_level)
//                 {
//                     operation.allowSceneActivation = true;
//                 }
//                 else
//                 {
//
//                     slider.value = 1;
//                     text.text = "输入任意按键继续...";
//
//                     if (Input.anyKeyDown)
//                     {
//                         operation.allowSceneActivation = true;
//                     }
//                 }
//             }
//
//             yield return null;
//         }
//     }
//
//     public float init_bgm_volume;
//
//     public void initialize_bgm_volume()
//     {
//         var game_info_obj = BdTools.FileTools.instance.game_info_obj;
//         if (bgm_audio_source_comp)
//         {
//             bgm_audio_source_comp.volume = init_bgm_volume * game_info_obj.bgm_volume;
//
//             // BdUtils.log(" --- 在LoadManager设置背景音乐! init_bgm_volume:", init_bgm_volume, "bgm_volume:", game_info_obj.bgm_volume, "bgm_audio_source_comp.volume:", bgm_audio_source_comp.volume);
//         }
//         // BdTools.FileTools.instance.set_game_volume(volume: volume, is_bgm_controller: true);
//     }
//
//     /// <sumary>
//     /// 初始化数据
//     /// </sumary>
//     private void Start()
//     {
//         if (BdTools.Flags.is_first_load_scene)
//             SceneManager.sceneLoaded += OnSceneLoaded;//绑定委托，加载场景的时候会调用此方法
//         BdTools.Flags.is_first_load_scene = false;
//
//         initialize_bgm_volume();
//     }
//
//     private void Update()
//     {
//     }
//
//     private void OnSceneLoaded(Scene scene, LoadSceneMode move)
//     {
//         // BdUtils.log(" === persistentDataPath:", Application.persistentDataPath);
//         // BdUtils.copy_file_from_streaming_to_persistant(BaseInfoManager.instance.game_info_file_name);
//
//         var current_scene = SceneManager.GetActiveScene();
//         string s_name = current_scene.name;
//         int s_id = current_scene.buildIndex;
//         // BdUtils.log(" --- 场景被加载了, 当前场景:", s_name);
//         // BdUtils.log(" --- s_name:", s_name, " id:", s_id);
//         // BaseInfoManager.instance.set_game_level(2);
//         // BdUtils.TimeUtils.seed
//         BdTools._obj_dc = null;
//         ObjectPool._instance = null;
//         // BtnCreateSoldier.instance.time_scale_index = 0;
//         Time.timeScale = 1;
//         BdTools.Values.GameConfig.surrender_delay = BdTools.Values.GameConfig.init_surrender_delay;
//
//         if (BdTools.Flags.is_game_level_equal_net_model)
//         {
//             var btn_restart = BdTools.get_game_object_by_path("/Canvas/btns/btn_restart_curr_level", raise_error: true);
//             btn_restart.SetActive(false);
//
//             var btn_accelerate = BdTools.get_game_object_by_path("/Canvas/btns/btn_accelerate", raise_error: true);
//             btn_accelerate.SetActive(false);
//         }
//
//         float t = 0.5f;  // [延迟/等待/休眠/timeout]t秒后执行
//         DOTween.To(() => t, (x) => t = x, 0, t).OnComplete(
//             () =>
//             {
//                 Agent.instance.policy.begin_surrender = false;
//             }
//         );
//
//         // --- 统计信息
//         string current_scene_name = current_scene.name;
//         if (current_scene_name != "PlayScene")
//             return;
//
//         string client_id = SystemInfo.deviceUniqueIdentifier;
//         string url = "/api/index/StatisticInfo/";
//         Dictionary<string, object> query_dc = new Dictionary<string, object>();
//         query_dc.Add("yong_hu_id", client_id);
//
//         string duration = (Time.time - BdTools.Values.last_upload_statistic_info_time).ToString();  // 统计游玩时长
//         BdTools.Values.last_upload_statistic_info_time = Time.time;
//         query_dc.Add("duration", duration);
//
//         query_dc.Add("game_level", BdTools.FileTools.instance.game_info_obj.game_level);
//
//         if (last_scene_name != "PlayScene")
//             query_dc.Add("dong_zuo", "选择关卡");
//         else
//             query_dc.Add("dong_zuo", "重新开始");
//         // query_dc.Add("bei_zhu", "重新开始");
//
//         t = 0.1f;  // [延迟/等待/休眠/timeout]t秒后执行
//         DOTween.To(() => t, (x) => t = x, 0, t).OnComplete(
//             () =>
//             {
//                 var response = AppAPIUtils.APIUtils.request_dict(url, method: "post", data: query_dc);
//             }
//         );
//     }
//
//     // public void set_game_level(int game_level)  // 为0则调用`reload_game_info`
//     // {
//     //     BdUtils.log(" === set_game_level:", game_level);
//
//     //     // GameInfo new_game_info_obj = new GameInfo();
//     //     game_info_obj.game_level = game_level;
//
//     //     string f_path = game_info_file_path;
//     //     File.WriteAllText(f_path, game_info_obj.ToString());
//
//     //     _game_info_obj = null;
//     //     // BdUtils.call(game_info_obj);
//     // }
//
//     public void btn_set_game_level_and_load_next_scene(int game_level)
//     {
//         BdUtils.assert(game_level != 0, "game_level没有赋值?");
//         // BaseInfoManager.instance.set_game_level(game_level);
//         BdTools.FileTools.instance.set_game_level(game_level);
//
//         var current_scene = SceneManager.GetActiveScene();
//         string current_scene_name = current_scene.name.ToString();
//         last_scene_name = current_scene_name.ToString();
//
//         _action_set_surrender_delay();
//
//         BdTools._obj_dc = null;
//
//         // BdUtils.log(" --- call reload_game_info_obj:", BdTools.FileTools.instance.game_info_obj);
//         BdUtils.call(BdTools.FileTools.instance.game_info_obj);
//
//         BtnCreateSoldier.reset_flag = true;
//
//         loadNextLevel();
//     }
//
//     void _action_set_surrender_delay()
//     {
//         if (_surrender_delay != BdUtils.DEFAULT_FLOAT)
//         {
//             BdUtils.log(" --- 设置`surrender_delay`:", _surrender_delay);
//             BdTools.Values.GameConfig.surrender_delay = _surrender_delay;
//         }
//         else
//         {
//             BdTools.Values.GameConfig.surrender_delay = BdTools.Values.GameConfig.init_surrender_delay;
//         }
//
//         _surrender_delay = BdUtils.DEFAULT_FLOAT;
//     }
//
//     /// <summary>
//     /// 重新载入当前等级的scene
//     /// </summary>
//     public void btn_reload_current_game_level_scene()
//     {
//         var current_scene = SceneManager.GetActiveScene();
//         string current_scene_name = current_scene.name.ToString();
//         last_scene_name = current_scene_name.ToString();
//
//         string scene_name = "PlayScene";
//         int game_level = BdTools.FileTools.instance.game_info_obj.game_level;
//
//         BdUtils.assert(game_level != 0, "game_level没有赋值?");
//         BdTools.FileTools.instance.set_game_level(game_level);
//
//         BtnCreateSoldier.reset_flag = true;
//
//         BdTools._obj_dc = null;
//         // BdUtils.log(" --- call reload_game_info_obj:", BdTools.FileTools.instance.game_info_obj);
//         BdUtils.call(BdTools.FileTools.instance.game_info_obj);
//
//         loadNextLevel(scene_name);
//     }
//
//     float _surrender_delay = BdUtils.DEFAULT_FLOAT;
//
//     public void action_set_surrender_delay(float surrender_delay)
//     {
//         _surrender_delay = surrender_delay;
//     }
//
//     public void btn_exit_game()
//     {
// #if UNITY_EDITOR
//         UnityEditor.EditorApplication.isPlaying = false;
// #else
//     Application.Quit();
// #endif
//     }
//
//
//     /// <summary>
//     /// 异步发送request请求, 没有返回值, 但可以使用`request_callback`来异步处理返回值
//     /// </summary>
//     public void async_request_dict(string url, string method = "post", Dictionary<string, object> data = null, UnityRequestCallBack request_callback = null, bool output_debug_info = true)
//     {
//         StartCoroutine(_async_request_dict(url, method: method, data: data, request_callback: request_callback, output_debug_info: output_debug_info));
//     }
//
//     public delegate void UnityRequestCallBack(string result = "", string error = ""); // 自定义回调委托类型
//
//     IEnumerator _async_request_dict(string url, string method = "post", Dictionary<string, object> data = null, UnityRequestCallBack request_callback = null, bool output_debug_info = true)
//     {
//         url = AppAPIUtils.APIUtils.MyRequestUtils.get_full_url(url);
//
//         // 创建一个包含要发送的数据的 Dictionary<string, object>
//
//         // Dictionary<string, object> dc = new Dictionary<string, object>();
//         // dc["yong_hu_id"] = "123123";
//
//         // 将数据转换为 JSON 字符串
//         // string jsonData = JsonConvert.SerializeObject(data);
//         string jsonData = BdUtils.conv_obj_to_json(data);
//
//         // UnityWebRequest request = UnityWebRequest.Post(url, jsonData);
//         // request.SetRequestHeader("Content-Type", "application/json");
//
//         BdUtils.assert(method.ToLower() == "post", "目前`method`仅支持`post`方法!");
//
//         var request = new UnityWebRequest(url, "post");
//         byte[] jsonToSend = new System.Text.UTF8Encoding().GetBytes(jsonData);
//         request.uploadHandler = (UploadHandler)new UploadHandlerRaw(jsonToSend);
//         request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
//         request.SetRequestHeader("Content-Type", "application/json");
//
//         yield return request.SendWebRequest();
//
//         string error = "";
//         string result = "";
//         if (request.result != UnityWebRequest.Result.Success)
//         {
//             error = request.error;
//             if (output_debug_info)
//                 Debug.Log("UnityWebRequest Error: " + request.error + $", url: {url}");
//         }
//         else
//         {
//             result = request.downloadHandler.text;
//             if (output_debug_info)
//                 Debug.Log("UnityWebRequest successful! url: {url}, result: " + request.downloadHandler.text);
//         }
//
//         if (request_callback != null)
//             request_callback(result: result, error: error);
//
//         request.uploadHandler.Dispose();
//         request.downloadHandler.Dispose();
//         request.Dispose();
//
//         // --- 这个restsharp会阻塞主线程
//         // var response = AppAPIUtils.APIUtils.request_dict(url, method: method, data: data, async_flag: true);
//
//         // // var response = AppAPIUtils.APIUtils.request_dict(url, method: method, data: data, async_flag: true, response_action: MyCallbackFunction);
//         // // var response = AppAPIUtils.APIUtils.request_dict(url, method: method, data: data);
//         // // var response = await AppAPIUtils.APIUtils.async_send_request(url, method, data);
//         // BdUtils.log(" response --- ", response);
//     }
//
//     // public static async System.Threading.Tasks.Task<IRestResponse> async_send_request(string url, RestRequest request, int client_timeout = Values.client_timeout)
//     // public static async System.Threading.Tasks.Task<IRestResponse> async_send_request(string url, string method = "get", Dictionary<string, object> data = null)
//     // {
//     //     // await System.Threading.Thread.Sleep(1000);
//     //     // await Task.Delay(1000); // 模拟耗时操作
//     //     return await AppAPIUtils.APIUtils.async_send_request(url, method, data); ;
// }
